package com.ktjy.controller;

import com.ktjy.entity.SysUser;
import com.ktjy.ex.LoginCreateTransactionException;
import com.ktjy.ex.LoginException;
import com.ktjy.service.SysUserService;
import com.ktjy.utils.Constants;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.CannotCreateTransactionException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

/**
 * 登录控制器
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-17 - 9:51
 */
@Controller // 标识当前这个类是一个用于接收并处理来自jsp客户端请求的控制器类, 用来替代Servlet
public class LoginController extends BaseController {

    @Autowired // 按SysUserService类型去Spring容器中实现类的依赖对象并进行注入
    private SysUserService sysUserService;  // = new SysUserServiceImpl()

    // 用于转发到login.jsp登录页面
    @GetMapping("/login")
    public String toLogin() {
        // return "forward:/login.jsp";  // forward转发
        return forward("/login.jsp");
    }

    // @RequestParam("account")用来接收从login.jsp登录页面提交时，传递过来的账号参数

    /**
     * 为login.jsp登录页面提交处理方法(处理登录请求)
     * @param account 接收从login.jsp登录页面传递过来的用户名
     * @param password 密码
     */
    @PostMapping("/login")
    public String login(
            @RequestParam("account") String account,
            @RequestParam("password") String password) {
        SysUser loginUser = null;
        try {
            loginUser = sysUserService.login(account, password);
        } catch (Exception e) {
            // 连接关闭时，会报错。
            throw new LoginCreateTransactionException(e.getMessage());
        }
        if (loginUser != null) {
            // 说明用户名和密码一定是正确的，即登录成功
            // session().setAttribute("loginUser", loginUser);
            session(Constants.SESSION_USER, loginUser);
            // return "redirect:/main/index";  // 再重定向到  /main/index 请求
            return redirect("/main/index");
        } else {
            // throw new RuntimeException("登录失败，用户名或密码错误!");
            throw new LoginException("登录失败，用户名或密码错误!");
            // request().setAttribute("error", "用户名或密码不正确!");
            // request(Constants.REQUEST_ERROR, "用户名或密码不正确!");
            // return "forward:/login.jsp";  // 转发到登录页面，继续进行登录
            // return forward("/login.jsp");
        }
    }
    @GetMapping("/ex")
    public void throwException() {
        throw new RuntimeException("测试不同异常映射到不同页面!");
    }

    @GetMapping("/main/index")
    public String index() {
        return "index";  //   /WEB-INF/jsp/index.jsp  跳转到index.jsp首页
    }

    // 注销请求的处理方法
    @GetMapping("/logout")
    public String logout() {
        removeSession(Constants.SESSION_USER);
        // session().removeAttribute("loginUser");  // 以Key为"loginUser"从session中进行删除。
        // return "redirect:/login.jsp";
        return redirect("/login.jsp");
    }

    // EXCEPTION异常  Handler处理器
    /*@ExceptionHandler(value = RuntimeException.class)  // 运行时异常
    public String handlerException(RuntimeException e) {
        // 一旦当前Controller报了运行时异常就会被当前方法进行捕获，再将异常信息保存到request作用域中
        request(Constants.REQUEST_ERROR, e);
        return "500";  // 500为500.jsp页面的视图名
    }*/


}

